/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.beans;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletResponse;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.cip.esymons.colegiatura.bc.ColegiadoDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoEspecialidadDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoImagenDelegate;
import org.cip.esymons.colegiatura.bc.DetalleSancionDelegate;
import org.cip.esymons.colegiatura.bc.DocumentoDelegate;
import org.cip.esymons.colegiatura.bc.DocumentoImagenDelegate;
import org.cip.esymons.colegiatura.bc.EspCapDelegate;
import org.cip.esymons.colegiatura.bc.SancionDelegate;
import org.cip.esymons.colegiatura.bc.solicitanteDelegate;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.ColegiadoImagen;
import org.cip.esymons.colegiatura.be.DetalleSancion;
import org.cip.esymons.colegiatura.be.Sancion;
import org.cip.esymons.general.be.ColegiadoEspecialidad;
import org.cip.esymons.general.be.EspecialidadCapitulo;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.tramite.be.Documento;
import org.cip.esymons.tramite.be.DocumentoImagen;

/**
 *
 * @author ADMINISTRADOR
 */
public class sancionarController {

    private ColegiadoDelegate delegadoColegiado;
    private SancionDelegate delegadoSancion;
    private DetalleSancionDelegate delegadoDetSancion;
    private ColegiadoEspecialidadDelegate colEspDelegado;
    private EspCapDelegate espCapDelegado;
    private DocumentoDelegate delegadoDocumento;
    private DocumentoImagenDelegate delegadoDocumentoImagen;
    private ColegiadoImagenDelegate delegadoColImagen;
    private solicitanteDelegate delegadoSolicitante;

    private Colegiado colegiado;
    private Sancion sancion;
    private DetalleSancion detSancion;
    private String codigoCip;
    private ColegiadoEspecialidad colEsp;
    private EspecialidadCapitulo espCap;
    private Documento documentos;
    private DocumentoImagen documentoImagen;
    private PersonaNatural persona;

    private String dni,apePaterno,apeMaterno,nombres;
    private String numeroDocumento;
    private String dirDocumento;
    private boolean activo;
    private boolean documento;
    private Integer seleccion;
    private Date fecha1,fecha2, fechaIni, fechaFin;
    private Integer cantidad;
    private Boolean noHallado;

    List<DetalleSancion> listaDetalleSancion;
    List<PersonaNatural> listaPersonasFotos;
    List<PersonaNatural> listaPersonas;


    public sancionarController() {

        delegadoColegiado = new ColegiadoDelegate();
        delegadoDetSancion = new DetalleSancionDelegate();
        delegadoSancion = new SancionDelegate();
        colEspDelegado = new ColegiadoEspecialidadDelegate();
        espCapDelegado = new EspCapDelegate();
        delegadoDocumento = new DocumentoDelegate();
        delegadoDocumentoImagen = new DocumentoImagenDelegate();
        delegadoSolicitante = new solicitanteDelegate();
        delegadoColImagen = new ColegiadoImagenDelegate();

        colegiado = new Colegiado();
        sancion = new Sancion();
        detSancion = new DetalleSancion();
        colEsp = new ColegiadoEspecialidad();
        espCap = new EspecialidadCapitulo();
        documentos = new Documento();
        documentoImagen = new DocumentoImagen();
        persona = new PersonaNatural();

        dirDocumento = "/modulos/colegiatura/archivos/documento/";
        activo = false;
        documento = false;

        listaDetalleSancion = new ArrayList<DetalleSancion>();
        listaDetalleSancion = null;
        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonasFotos = null;
        listaPersonas = new ArrayList<PersonaNatural>();
        listaPersonas = null;
        noHallado = false;
    }

    public PersonaNatural getPersona() {
        return persona;
    }

    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public ColegiadoImagenDelegate getDelegadoColImagen() {
        return delegadoColImagen;
    }

    public void setDelegadoColImagen(ColegiadoImagenDelegate delegadoColImagen) {
        this.delegadoColImagen = delegadoColImagen;
    }

    public solicitanteDelegate getDelegadoSolicitante() {
        return delegadoSolicitante;
    }

    public void setDelegadoSolicitante(solicitanteDelegate delegadoSolicitante) {
        this.delegadoSolicitante = delegadoSolicitante;
    }

    public List<PersonaNatural> getListaPersonas() {
        return listaPersonas;
    }

    public void setListaPersonas(List<PersonaNatural> listaPersonas) {
        this.listaPersonas = listaPersonas;
    }

    public List<PersonaNatural> getListaPersonasFotos() {
        return listaPersonasFotos;
    }

    public void setListaPersonasFotos(List<PersonaNatural> listaPersonasFotos) {
        this.listaPersonasFotos = listaPersonasFotos;
    }

    public String getApeMaterno() {
        return apeMaterno;
    }

    public void setApeMaterno(String apeMaterno) {
        this.apeMaterno = apeMaterno;
    }

    public String getApePaterno() {
        return apePaterno;
    }

    public void setApePaterno(String apePaterno) {
        this.apePaterno = apePaterno;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public Boolean getNoHallado() {
        return noHallado;
    }

    public void setNoHallado(Boolean noHallado) {
        this.noHallado = noHallado;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public DocumentoDelegate getDelegadoDocumento() {
        return delegadoDocumento;
    }

    public void setDelegadoDocumento(DocumentoDelegate delegadoDocumento) {
        this.delegadoDocumento = delegadoDocumento;
    }

    public DocumentoImagenDelegate getDelegadoDocumentoImagen() {
        return delegadoDocumentoImagen;
    }

    public void setDelegadoDocumentoImagen(DocumentoImagenDelegate delegadoDocumentoImagen) {
        this.delegadoDocumentoImagen = delegadoDocumentoImagen;
    }

    public DocumentoImagen getDocumentoImagen() {
        return documentoImagen;
    }

    public void setDocumentoImagen(DocumentoImagen documentoImagen) {
        this.documentoImagen = documentoImagen;
    }

    public Documento getDocumentos() {
        return documentos;
    }

    public void setDocumentos(Documento documentos) {
        this.documentos = documentos;
    }

    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    public Date getFecha1() {
        return fecha1;
    }

    public void setFecha1(Date fecha1) {
        this.fecha1 = fecha1;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public List<DetalleSancion> getListaDetalleSancion() {
        return listaDetalleSancion;
    }

    public void setListaDetalleSancion(List<DetalleSancion> listaDetalleSancion) {
        this.listaDetalleSancion = listaDetalleSancion;
    }

    public Integer getSeleccion() {
        return seleccion;
    }

    public void setSeleccion(Integer seleccion) {
        this.seleccion = seleccion;
    }

    public boolean getDocumento() {
        return documento;
    }

    public void setDocumento(boolean documento) {
        this.documento = documento;
    }

    public boolean getActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    public ColegiadoDelegate getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoDelegate delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public DetalleSancionDelegate getDelegadoDetSancion() {
        return delegadoDetSancion;
    }

    public void setDelegadoDetSancion(DetalleSancionDelegate delegadoDetSancion) {
        this.delegadoDetSancion = delegadoDetSancion;
    }

    public SancionDelegate getDelegadoSancion() {
        return delegadoSancion;
    }

    public void setDelegadoSancion(SancionDelegate delegadoSancion) {
        this.delegadoSancion = delegadoSancion;
    }

    public DetalleSancion getDetSancion() {
        return detSancion;
    }

    public void setDetSancion(DetalleSancion detSancion) {
        this.detSancion = detSancion;
    }

    public Sancion getSancion() {
        return sancion;
    }

    public void setSancion(Sancion sancion) {
        this.sancion = sancion;
    }

    public String getCodigoCip() {
        return codigoCip;
    }

    public void setCodigoCip(String codigoCip) {
        this.codigoCip = codigoCip;
    }

    public ColegiadoEspecialidad getColEsp() {
        return colEsp;
    }

    public void setColEsp(ColegiadoEspecialidad colEsp) {
        this.colEsp = colEsp;
    }

    public EspecialidadCapitulo getEspCap() {
        return espCap;
    }

    public void setEspCap(EspecialidadCapitulo espCap) {
        this.espCap = espCap;
    }

    public ColegiadoEspecialidadDelegate getColEspDelegado() {
        return colEspDelegado;
    }

    public void setColEspDelegado(ColegiadoEspecialidadDelegate colEspDelegado) {
        this.colEspDelegado = colEspDelegado;
    }

    public EspCapDelegate getEspCapDelegado() {
        return espCapDelegado;
    }

    public void setEspCapDelegado(EspCapDelegate espCapDelegado) {
        this.espCapDelegado = espCapDelegado;
    }

    public String inicializa(){

        colegiado = new Colegiado();
        sancion = new Sancion();
        detSancion = new DetalleSancion();
        colEsp = new ColegiadoEspecialidad();
        espCap = new EspecialidadCapitulo();
        documentos = new Documento();
        documentoImagen = new DocumentoImagen();

        dirDocumento = "/modulos/colegiatura/archivos/documento/";
        activo = false;
        documento = false;

        listaDetalleSancion = new ArrayList<DetalleSancion>();
        listaDetalleSancion = null;
        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonasFotos = null;
        listaPersonas = new ArrayList<PersonaNatural>();
        listaPersonas = null;
        noHallado = false;
        codigoCip = "";

        return null;
    }

    public String buscaPorNroCip(){
        try{

        Integer cifras = codigoCip.length();
             if(cifras<3){
                 codigoCip = "0000"+ codigoCip;
             }else{
                   if(cifras<4){
                       codigoCip = "000"+codigoCip;
                   }else{
                       if(cifras<5){
                           codigoCip = "00"+codigoCip;
                       }else{
                           if(cifras<6){
                              codigoCip = "0"+codigoCip;
                           }
                       }
                   }
             }
        colegiado = delegadoColegiado.buscaPorCip(codigoCip);
        if(colegiado.getColnumeroCip()!= ""){
            codigoCip = null;
            buscaEspCap();
            activo = true;
            return null;
        }else{
            noHallado = true;
            mostrarMensaje("Mensaje: ", "No se encontro colegiado", FacesMessage.SEVERITY_ERROR);
            return null;
        }
        }catch(Exception ex){
            
         return null;
        }
    }

   public String buscarColegiado(){

        String ruc;
        Boolean soloColegiados;
        try{
            ruc = "";
            soloColegiados = true;
            ColegiadoImagen foto = new ColegiadoImagen();

            listaPersonasFotos = new ArrayList<PersonaNatural>();
            listaPersonas = new ArrayList<PersonaNatural>();
            listaPersonas = delegadoSolicitante.buscarPerNatural(dni, apePaterno, apeMaterno, nombres, ruc, soloColegiados);
            if(listaPersonas.size()>0){
                for(PersonaNatural per : listaPersonas ){

                    Long codigoPer = per.getSolCodigo();
                    foto = delegadoColImagen.buscaFoto(codigoPer);
                    if(foto != null) {
                       per.setFoto(foto);
                    }
                    listaPersonasFotos.add(per);
                }
                dni = "";
                apePaterno = "";
                apeMaterno ="";
                nombres = "";
        }else{
            noHallado = true;
            mostrarMensaje("Mensaje: ", "No se encontro colegiado", FacesMessage.SEVERITY_ERROR);
        }
        }catch(Exception ex){

            return null;
        }
      return null;
    }

   public void drawImagenListaFotos(OutputStream output, Object object) throws IOException{

        PersonaNatural person = new PersonaNatural();

        try {
             Integer index = new Integer(object.toString());
             person = listaPersonasFotos.get(index);
             File file = new File(person.getFoto().getCimRuta());
             FileInputStream inputStream = new FileInputStream(file);
             int tamañoInput = inputStream.available();
             byte[] datos = new byte[tamañoInput];
             inputStream.read(datos, 0, tamañoInput);
             output.write(datos, 0, tamañoInput);

        } catch (Exception e) {

        }
    }

   public String seleccionar(){

        try {
            colegiado = new Colegiado();
            colegiado = delegadoColegiado.buscaColegiado(persona.getSolCodigo());//buscaPorDni(persona.getPerNroDNI());
            buscaEspCap();
            listaPersonasFotos = null; // ultimo cambio
            persona = new PersonaNatural();
            activo = true;
            return null;

        } catch (Exception e) {
            return null;
        }
    }

   public String cerrarVentana(){

       inicializa();
       return null;
   }

   public String buscaColEsp(){
       try{
        colEsp = colEspDelegado.colegiadoEsp(colegiado.getSolCodigo());
        return null;
       }catch(Exception ex){
           System.out.println(ex);
           return null;
       }

    }

    public String buscaEspCap(){
        buscaColEsp();
        try{
        espCap = espCapDelegado.espCapitulo(colEsp.getEcaCodigo().getEcaCodigo());
        return null;
        }catch(Exception ex){
            System.out.println(ex);
            return null;
        }
    }

    public String nuevo(){      

        colegiado = new Colegiado();
        sancion = new Sancion();
        detSancion = new DetalleSancion();
        colEsp = new ColegiadoEspecialidad();
        espCap = new EspecialidadCapitulo();

        activo = false;
        documento = false;
        return "ir_a_sancion";
    }

    public String buscarDocumento(){

        try{
        documentos = delegadoDocumento.buscaDocumento(numeroDocumento);
        documentoImagen = delegadoDocumentoImagen.buscaDocumentoImagen(documentos);
        
        }catch(Exception ex){
            return null;
        }       

        return null;
    }

    public String sancionar(){

        detSancion.setColegiado(colegiado);
        detSancion.setDsafechaRegistro(new Date());
        detSancion.setDsaDocumento(documentoImagen.getDimNombre());
        detSancion.setDsarutaDocumento(documentoImagen.getDimRuta());
      
        colegiado.getListaDetalleSancion().add(detSancion);
        delegadoColegiado.edit(colegiado);

        detSancion = new DetalleSancion();
        documentos = new Documento();
        documentoImagen = new DocumentoImagen();
        codigoCip = null;
        documento = false;
        dirDocumento = "/modulos/colegiatura/archivos/documento/";
        numeroDocumento = "";
        mostrarMensaje("INFO: ", "Sanción registrada satisfactoriamente...", FacesMessage.SEVERITY_INFO);
        return null;
    }

    public String muestraDoc() throws IOException{

     try{
         Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+detSancion.getDsarutaDocumento());
        }catch(Exception ex){
         ex.printStackTrace();
        }
        return null;
    }

    public String mostrarDoc() {
        try {
            File file = new File(detSancion.getDsarutaDocumento());
            FacesContext fcontext = FacesContext.getCurrentInstance();
            ExternalContext eContext = fcontext.getExternalContext();
            HttpServletResponse response = (HttpServletResponse) eContext.getResponse();
            response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
            response.setHeader("Cache-Control", "public");
            response.setContentType("application/" + detSancion.getAplication());
            OutputStream os = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(file);
            int tamanoInput = inputStream.available();
            byte[] datosPDF = new byte[tamanoInput];
            inputStream.read(datosPDF, 0, tamanoInput);
            os.write(datosPDF, 0, tamanoInput);
            os.close();
            fcontext.responseComplete();

//            HttpServletResponse response = (HttpServletResponse) ControladorAbstracto.getResponse();
//
//            OutputStream os = response.getOutputStream();
//            File file = new File(fileName);
//            FileInputStream inputStream = new FileInputStream(file);
//            int tamanoInput = inputStream.available();
//            byte[] datosPDF = new byte[tamanoInput];
//            inputStream.read(datosPDF, 0, tamanoInput);
//            os.write(datosPDF, 0, tamanoInput);
//
//            inputStream.close();
//            os.close();
        } catch (Exception e) {
            mostrarMensaje("Mensaje: ", "No tiene documento adjunto", FacesMessage.SEVERITY_ERROR);
            return "";
        }
        return "";
    }

   public String limpiar(){

        inicializa();
        return null;
    }

    public String ListarSancion(){
        return "lista_sanciones";
    }

    public List<DetalleSancion> getListaSanciones(){

        return delegadoDetSancion.listaSanciones(colegiado.getSolCodigo());
    }


    public SelectItem[] getSelectListaItemSancion(){

      try{
//        System.out.println("Ingreso 1");
        SelectItem[] selects = null;
        List<Sancion> listaSancion = delegadoSancion.findAll();
        selects = new SelectItem[listaSancion.size()];
        int cont = 0;
        for(Sancion san : listaSancion){

            SelectItem item = new SelectItem(san, san.getSanNombre());
            selects[cont] = item;
            cont++;
        }
        return selects;
      }catch(Exception e){
            System.out.println("Ingreso Error");
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen sanciones");
            selects[0] = item;
            return selects;
      }
    }


     //SUBIR ARCHIVOS

    private UploadedFile upFile;
    boolean rendSuccess = false;
    boolean rendFailure = false;
    private String imagen;

    public boolean isRendFailure() {
        return rendFailure;
    }

    public void setRendFailure(boolean rendFailure) {
        this.rendFailure = rendFailure;
    }

    public boolean isRendSuccess() {
        return rendSuccess;
    }

    public void setRendSuccess(boolean rendSuccess) {
        this.rendSuccess = rendSuccess;
    }

    public UploadedFile getUpFile() {
        return upFile;
    }

    public void setUpFile(UploadedFile upFile) {
        this.upFile = upFile;
    }

    public String getImagen() {
        return imagen;
    }

    public void setImagen(String imagen) {
        this.imagen = imagen;
    }

    public String upload() throws IOException {
        try {

                InputStream stream = upFile.getInputStream();
                System.out.println(dirDocumento.concat(upFile.getName()));
                OutputStream out=new FileOutputStream(dirDocumento.concat(upFile.getName()));
                long size = upFile.getSize();
                byte[] buffer = new byte[(int) size];
                stream.read(buffer, 0, (int) size);
                out.write(buffer, 0, (int) size);
                stream.close();
                out.close();
                documento = true;
                rendSuccess = true;
                rendFailure = false;
//                setImagen(upFile.getName());
                System.out.println("File Upload Successful.");
                return "ok";

        } catch (Exception ioe) {
            System.out.println("File Upload Unsuccessful.");
            System.out.println("errorrrr" + ioe.toString());
            rendSuccess = false;
            rendFailure = true;
            return "no";
        }

    }

    public List<DetalleSancion> listaDetalleSancionOrdenFecha(){

       listaDetalleSancion = new ArrayList<DetalleSancion>();
       listaDetalleSancion = delegadoDetSancion.listaDetalleSancionOrdenFecha(fecha1, fecha2);
       cantidad = listaDetalleSancion.size();
       return listaDetalleSancion;
    }

    public List<DetalleSancion> listaDetalleSancionOrdenCIP(){

       listaDetalleSancion = new ArrayList<DetalleSancion>();
       listaDetalleSancion = delegadoDetSancion.listaDetalleSancionOrdenCip(fecha1, fecha2);
       cantidad = listaDetalleSancion.size();
       return listaDetalleSancion;
    }

    public List<DetalleSancion> listaDetalleSancionOrdenApellidos(){

       listaDetalleSancion = new ArrayList<DetalleSancion>();
       listaDetalleSancion = delegadoDetSancion.listaDetalleSancionOrdenApellidos(fecha1, fecha2);
       cantidad = listaDetalleSancion.size();
       return listaDetalleSancion;
    }

    public List<DetalleSancion> listaDetalleSancionOrdenSancion(){

       listaDetalleSancion = new ArrayList<DetalleSancion>();
       listaDetalleSancion = delegadoDetSancion.listaDetalleSancionOrdenSancion(fecha1, fecha2);
       cantidad = listaDetalleSancion.size();
       return listaDetalleSancion;
    }

    public String listarSancionesPorFecha(){

        if(seleccion == null){

            seleccion =1;
        }

        switch(seleccion){

            case 1: listaDetalleSancionOrdenCIP();
                    fechaIni = fecha1;
                    fechaFin = fecha2;
                    fecha1 = null;
                    fecha2 = null;
                    break;
            case 2: listaDetalleSancionOrdenApellidos();
                    fechaIni = fecha1;
                    fechaFin = fecha2;
                    fecha1 = null;
                    fecha2 = null;
                    break;
            case 3: listaDetalleSancionOrdenFecha();
                    fechaIni = fecha1;
                    fechaFin = fecha2;
                    fecha1 = null;
                    fecha2 = null;
                    break;
            case 4: listaDetalleSancionOrdenSancion();
                    fechaIni = fecha1;
                    fechaFin = fecha2;
                    fecha1 = null;
                    fecha2 = null;
                    break;

        }
        return null;
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    

}
